]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
ScreenShield: don't rely on gnome-session to hide the lightbox
authorGiovanni Campagna <gcampagna@src.gnome.org>
Sun, 28 Oct 2012 11:26:21 +0000 (12:26 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 5 Nov 2012 21:04:09 +0000 (22:04 +0100)
If we lock before the user becomes active again, gnome-session will never
change presence from IDLE, and thus we'll never hide the lightbox.
Instead, install our own idle monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=687020

js/ui/screenShield.js

index 52c7dcc7570f3348e7c634453ddc888a19187fe0..6dcd188fa6f8b14cf84cfc293d07f70b1d493a81 100644 (file)
@@ -436,6 +436,8 @@ const ScreenShield = new Lang.Class({
                                                { inhibitEvents: true,
                                                  fadeInTime: STANDARD_FADE_TIME,
                                                  fadeFactor: 1 });
+
+        this.idleMonitor = new GnomeDesktop.IdleMonitor();
     },
 
     _onLockScreenKeyRelease: function(actor, event) {
@@ -545,35 +547,43 @@ const ScreenShield = new Lang.Class({
     },
 
     _onStatusChanged: function(status) {
-        if (status == GnomeSession.PresenceStatus.IDLE) {
-            if (this._dialog) {
-                this._dialog.cancel();
-                if (!this._isGreeter) {
-                    this._dialog = null;
-                }
-            }
+        if (status != GnomeSession.PresenceStatus.IDLE)
+            return;
 
-            if (!this._isModal) {
-                Main.pushModal(this.actor);
-                this._isModal = true;
+        if (this._dialog) {
+            this._dialog.cancel();
+            if (!this._isGreeter) {
+                this._dialog = null;
             }
+        }
 
-            if (!this._isActive) {
-                this._lightbox.show();
+        if (!this._isModal) {
+            Main.pushModal(this.actor);
+            this._isModal = true;
+        }
 
-                if (this._activationTime == 0)
-                    this._activationTime = GLib.get_monotonic_time();
-            }
-        } else {
-            let lightboxWasShown = this._lightbox.shown;
-            this._lightbox.hide();
+        if (!this._isActive) {
+            this._lightbox.show();
 
-            let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
-            if (shouldLock || this._isActive) {
-                this.lock(false);
-            } else if (this._isModal) {
-                this.unlock();
-            }
+            if (this._activationTime == 0)
+                this._activationTime = GLib.get_monotonic_time();
+
+            this._becameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, function() {
+                this.idleMonitor.disconnect(this._becameActiveId);
+
+                let lightboxWasShown = this._lightbox.shown;
+                this._lightbox.hide();
+
+                let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
+                if (shouldLock || this._isLocked) {
+                    this.lock(false);
+                } else if (this._isActive) {
+                    this.unlock();
+                }
+            }));
+
+            this._isActive = true;
+            this.emit('lock-status-changed');
         }
     },
 
@@ -830,6 +840,7 @@ const ScreenShield = new Lang.Class({
 
         this._activationTime = 0;
         this._isActive = false;
+        this._isLocked = false;
         this.emit('lock-status-changed');
     },
 
@@ -854,6 +865,7 @@ const ScreenShield = new Lang.Class({
         this._resetLockScreen(animate, animate);
 
         this._isActive = true;
+        this._isLocked = true;
         this.emit('lock-status-changed');
     },
 });